﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace mrp16062010.Rota
{
    class Karmala
    {
        List<OptimumSiralama> tekTablo = new List<OptimumSiralama>();
        public List<List<OptimumSiralama>> anaListe;
        List<OptimumSiralama> denenenDurumlar = new List<OptimumSiralama>();
        //public static int debugcount = 0;
        public Karmala(Rota.RotaParcasi rota)
        {
            Hazirla(rota);
            Karistir();
        }

        private void Karistir()
        {
            foreach (OptimumSiralama sira in tekTablo)
            {
                List<List<OptimumSiralama>> tempListe = new List<List<OptimumSiralama>>();
                List<List<OptimumSiralama>> kopyalanacakListe = new List<List<OptimumSiralama>>();
                if (anaListe == null)
                {
                    anaListe = new List<List<OptimumSiralama>>();
                    kopyalanacakListe.Add(tekTablo);
                    denenenDurumlar.AddRange(tekTablo.Skip(1));
                }
                else
                {
                    kopyalanacakListe.AddRange(anaListe);
                }
                List<Rota.RotaParcasi> liste = sira.Siralama.ToList();
                IEnumerable<IEnumerable<Rota.RotaParcasi>> karList = PermuteUtils.Permute<Rota.RotaParcasi>(liste, liste.Count);
                if (denenenDurumlar.Where(x => x.Ust == sira.Ust).Count()>0)
                {
                    IEnumerable<Rota.RotaParcasi> birDurum = denenenDurumlar.Where(x => x.Ust == sira.Ust).Single().Siralama;

                    List<IEnumerable<Rota.RotaParcasi>>  tempKarList = new List<IEnumerable<Rota.RotaParcasi>>();
                    foreach (var karEleman in karList)
                    {/*
                        karEleman.SequenceEqual(birDurum)
                        List<Rota.RotaParcasi> elem = (from x in karEleman
                                                       select x).ToList<Rota.RotaParcasi>();*/
                        if (!karEleman.SequenceEqual(birDurum))
                        {
                            tempKarList.Add(karEleman);
                        }
                    }
                    karList = tempKarList;
                }
               
                foreach (IEnumerable<Rota.RotaParcasi> karEleman in karList)
                {
                    foreach (List<OptimumSiralama> durum in kopyalanacakListe)
                    {
                        List<OptimumSiralama> yeniTekList = new List<OptimumSiralama>();

                        yeniTekList.AddRange(durum);
                        yeniTekList.Where(x => x.Ust == sira.Ust).Single().Siralama = karEleman;
                        tempListe.Add(yeniTekList);
                    }
                }
                anaListe.AddRange(tempListe);
                kopyalanacakListe.Clear();
            }
        }

        private void Hazirla(Rota.RotaParcasi rota)
        {
            if (rota.OperasyonList.Count == 0)
            {
                return;
            }
            Rota.Operasyon operasyon = rota.OperasyonList.First();
            if (operasyon.AltParca.Count > 0)
            {
                OptimumSiralama nesne = new OptimumSiralama();
                nesne.Ust = operasyon;
                nesne.Siralama = operasyon.AltParca;
                tekTablo.Add(nesne);
            }

            foreach (Rota.RotaParcasi rp in operasyon.AltParca)
            {
                Hazirla(rp);
            }
        }


    }
}
